﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Graphics;
using TrabalhoSeven.Estados.Jogo;
using Microsoft.Xna.Framework.Content;

namespace TrabalhoSeven{
	class Personagem : Sprite{

		ContentManager Content;
		animacao anim_teleport;
		animacao anim_parado;
		animacao anim_andando;
		animacao anim_correndo;
		animacao anim_atirando;
		animacao anim_atira_andando;
		animacao anim_atira_correndo;
		
		animacao anim_atual;
		bool vivo = true;
		bool movendo = false;
		public bool Movendo {
			get {
				return movendo;
			}
		}
		bool atirando = false;
		bool carregado = false;
		bool pisca = false;
		public bool[] colidiu = {false,false,false, false}; //W,A,S,D -> cima, esquerda, baixo, direita
		double delayAnimAtirar = 0;
		double delayAnimCarregar = 0;
		double delayPiscaCarregado = 0;
		Keys []teclas;

		public Personagem(ContentManager Content, String nomePersonagem, int numPlayer):base(Content.Load<Texture2D>(nomePersonagem)){
			
			this.Content = Content;
			this.hitbox = new Rectangle((int)this.posicao.X, (int)this.posicao.Y, 52, 44);

			teclas = new Keys[6];
			if (numPlayer == 1) {
				posicao = new Vector2(200, 300);
				teclas[0] = Keys.W; teclas[1] = Keys.A; teclas[2] = Keys.S; teclas[3] = Keys.D;
				teclas[4] = Keys.Space; teclas[5] = Keys.LeftControl;
			}
			else {
				posicao = new Vector2(500, 300);
				direita = false;
				teclas[0] = Keys.Up; teclas[1] = Keys.Left; teclas[2] = Keys.Down; teclas[3] = Keys.Right;
				teclas[4] = Keys.NumPad0; teclas[5] = Keys.RightControl;
			}

			anim_parado = new animacao();
			anim_parado.quadro_X = 52;
			anim_parado.quadro_Y = 44;
			anim_parado.qtd_quadros = 1;
			anim_parado.quadros_seg = 1;
			anim_parado.Y = 3 * 44;

			anim_andando = new animacao();
			anim_andando.quadro_X = 52;
			anim_andando.quadro_Y = 44;
			anim_andando.qtd_quadros = 4;
			anim_andando.quadros_seg = 4;
			anim_andando.Y = 1 * 44;

			anim_correndo = new animacao();
			anim_correndo.quadro_X = 52;
			anim_correndo.quadro_Y = 44;
			anim_correndo.qtd_quadros = 4;
			anim_correndo.quadros_seg = 4;
			anim_correndo.Y = 2 * 44;

			anim_atirando = new animacao();
			anim_atirando.quadro_X = 52;
			anim_atirando.quadro_Y = 44;
			anim_atirando.qtd_quadros = 1;
			anim_atirando.quadros_seg = 1;
			anim_atirando.Y = 4 * 44;

			anim_atira_andando = new animacao();
			anim_atira_andando.quadro_X = 52;
			anim_atira_andando.quadro_Y = 44;
			anim_atira_andando.qtd_quadros = 4;
			anim_atira_andando.quadros_seg = 4;
			anim_atira_andando.Y = 5 * 44;

			anim_atira_correndo = new animacao();
			anim_atira_correndo.quadro_X = 52;
			anim_atira_correndo.quadro_Y = 44;
			anim_atira_correndo.qtd_quadros = 4;
			anim_atira_correndo.quadros_seg = 4;
			anim_atira_correndo.Y = 6 * 44;

			anim_atual = anim_parado;
		}

		public override void Update(GameTime gameTime) { }
		public void Update(GameTime gameTime, GameWindow Window, KeyboardState teclado_atual, KeyboardState teclado_anterior, ControladorTiro cTiro) {
			if (vivo == true) {
				if (teclado_atual.IsKeyDown(teclas[4])) {
					if (teclado_anterior.IsKeyDown(teclas[4]) == false) {//se apenas apertou o botao de tiro
						if (direita == true) {
							cTiro.newTiro(Content, new Vector2(this.posicao.X + 52, this.posicao.Y), 1, cTiro.NORMAL);
						}
						else {
							cTiro.newTiro(Content, new Vector2(this.posicao.X - 52, this.posicao.Y), -1, cTiro.NORMAL);
						}
						atirando = true;
						anim_atual = anim_atirando;
					}
					else {//se apertou e segurou o botao de tiro
						delayAnimCarregar += gameTime.ElapsedGameTime.TotalMilliseconds;
						if (delayAnimCarregar >= 200) {
							this.corRGB[0] -= 0.1f;
							this.corRGB[2] -= 0.1f;
							delayAnimCarregar = 0;
						}
						if ((this.corRGB[0] <= 0f) && (this.corRGB[2] <= 0f)) {
							carregado = true;
						}
					}
				}

				if (carregado == true) {//se estiver carregado, comeca a fazer a animacao de carregado
					delayPiscaCarregado += gameTime.ElapsedGameTime.TotalMilliseconds;
					if (delayPiscaCarregado >= 150) {
						pisca = this.animPiscaCarregado(pisca);
						delayPiscaCarregado = 0;
					}
				}

				if (teclado_atual.IsKeyUp(teclas[4])) {//quando solta o botao de atirar, verifica se estava carregado
					if (carregado == true) {
						if (direita == true) {
							cTiro.newTiro(Content, new Vector2(this.posicao.X + 52, this.posicao.Y), 1, cTiro.SUPER);
						}
						else {
							cTiro.newTiro(Content, new Vector2(this.posicao.X - 52, this.posicao.Y), -1, cTiro.SUPER);
						}
						atirando = true;
						anim_atual = anim_atirando;
					}
					carregado = false;
					this.corRGB[0] = this.corRGB[2] = 1.0f;
				}

				if (atirando == true) {//se estiver atirando, fazer um delay para manter a animacao de 'atirando'
					delayAnimAtirar += gameTime.ElapsedGameTime.TotalMilliseconds;
					if (delayAnimAtirar >= 300) {
						atirando = false;
						delayAnimAtirar = 0;
					}
				}
				
				if (teclado_atual.IsKeyDown(teclas[0])) {
						movendo = true;
						posicao.Y -= velocidade.Y;
				}
				if (teclado_atual.IsKeyDown(teclas[1])) {
						movendo = true;
						direita = false;
						posicao.X -= velocidade.X;
				}
				if (teclado_atual.IsKeyDown(teclas[2])) {
						movendo = true;
						posicao.Y += velocidade.Y;
				}
				if (teclado_atual.IsKeyDown(teclas[3])) {
						movendo = true;
						direita = true;
						posicao.X += velocidade.X;
				}
				
				if (movendo == true) {
					if (atirando == false) {
						anim_atual = anim_andando;
					}
					else {
						anim_atual = anim_atira_andando;
					}
					if (teclado_atual.IsKeyUp(teclas[0]) && (teclado_atual.IsKeyUp(teclas[1])) &&
						(teclado_atual.IsKeyUp(teclas[2])) && (teclado_atual.IsKeyUp(teclas[3]))) {
						movendo = false;
						if (atirando == false) {
							anim_atual = anim_parado;
						}
						else {
							anim_atual = anim_atira_correndo;
						}
					}
				}
				else {
					if (atirando == false) {
						anim_atual = anim_parado;
					}
					else {
						anim_atual = anim_atirando;
					}
				}

				if (teclado_atual.IsKeyDown(teclas[5]) && teclado_anterior.IsKeyDown(teclas[5])) {
					velocidade.X = 3;
					velocidade.Y = 3;
					if (teclado_atual.IsKeyDown(teclas[0]) || (teclado_atual.IsKeyDown(teclas[1])) ||
						(teclado_atual.IsKeyDown(teclas[2])) || (teclado_atual.IsKeyDown(teclas[3]))) {
						if (atirando == false) {
							anim_atual = anim_correndo;
						}
					}
				}
				else {
					velocidade.X = 1;
					velocidade.Y = 1;
				}

				if (this.posicao.X < 0) {
					this.posicao.X = 0;
				}
				if (this.posicao.Y < 0) {
					this.posicao.Y = 0;
				}
				if (this.posicao.X > Window.ClientBounds.Width - 52) {
					this.posicao.X = Window.ClientBounds.Width - 52;
				}
				if (this.posicao.Y > Window.ClientBounds.Height - 44) {
					this.posicao.Y = Window.ClientBounds.Height - 44;
				}

				this.hitbox.X = (int)this.posicao.X;
				this.hitbox.Y = (int)this.posicao.Y;
				System.Console.WriteLine(hitbox.X + " " + hitbox.Y + " " + hitbox.Width + " " + hitbox.Height);
			}
		}

		private bool animPiscaCarregado(bool pisca) {
			if (pisca == true) {
				this.corRGB[0] = this.corRGB[2] = 1.0f;	
			}
			else {
				this.corRGB[0] = this.corRGB[2] = 0f;
			}
			return !pisca;
		}

		public void kill() {//gambiarra feliz :)
			this.visivel = false;
			this.hitbox = new Rectangle(0, 0, 0, 0);
			vivo = false;
		}

		public void Draw(GameTime gameTime, SpriteBatch spriteBatch) {
			if (vivo == true) {
				base.Draw(gameTime, spriteBatch, anim_atual);
			}
		}
	}
}
